package org.xlp.db.xml;

import org.xlp.assertion.AssertUtils;
import org.xlp.db.xml.ele.SQLEle;

import java.io.File;

/**
 * sql语句xml配置文件解析接口
 */
public interface ISQLXmlParser {
    /**
     * 解析sql xml配置文件
     * @param file sql xml配置文件
     * @throws IllegalArgumentException 假如参数不是xml文件，则抛出该异常
     * @throws NullPointerException 假如参数为null，则抛出该异常
     */
    default void parseFile(File file) {
        AssertUtils.isNotNull(file, "file parameter must not be null!");
        if (!file.exists() || file.isDirectory()){
            throw new IllegalArgumentException("要解析的文件不是xml文件");
        }
        parseFile(file.getAbsolutePath());
    }

    /**
     * 解析sql xml配置文件路径
     * @param filePath sql xml配置文件路径
     */
    public void parseFile(String filePath);

    /**
     * 解析给定的目录下所有的sql xml配置文件
     * @param directory sql xml配置文件目录
     */
    public void parseDirectory(File directory);

    /**
     * 解析给定的目录下所有的sql xml配置文件
     * @param directory sql xml配置文件目录
     * @throws IllegalArgumentException 假如参数不是文件目录，则抛出该异常
     * @throws NullPointerException 假如参数为null，则抛出该异常
     */
    default void parseDirectory(String directory) {
        AssertUtils.isNotNull(directory, "directory parameter must not be null or empty!");
        parseDirectory(new File(directory));
    }

    /**
     * 更据Id获取相应的{@link SQLEle}对象
     * @see SQLsElementInfo
     * @see SQLEle
     * @param parentId {@link SQLsElementInfo}的id值
     * @param id {@link SQLEle}的id值
     * @return {@link SQLEle}对象
     * @throws NullPointerException 假如参数为null或""，则抛出该异常
     */
    public SQLEle getSqlEle(String parentId, String id);
}
